package br.edu.fateczl.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

import br.edu.fateczl.model.Cliente;
import br.edu.fateczl.model.Contato;
import br.edu.fateczl.model.Endereco;
import br.edu.fateczl.model.Funcionario;

public class FuncionarioDAO {
	Connection c;

	public FuncionarioDAO() {
		GenericDAO gDao = new GenericDAO();
		c = gDao.getConnection();
	}

	public boolean insereFuncionario(Funcionario funcionario) {
		boolean inserido = false;
		String sql = "INSERT INTO funcionario (codigo,cpf,cargo,codigo_usuario) VALUES (?,?,?,?)";

		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, funcionario.getCodigo());
			ps.setString(2, funcionario.getCpf());
			ps.setString(3, funcionario.getCargo());
			ps.setInt(4, funcionario.getCodigo_usuario());
			ps.execute();
			ps.close();
			inserido = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return inserido;
	}

	public boolean atualizaFuncionario(Funcionario funcionario) {
		boolean atualizado = false;
		String sql = "UPDATE funcionario set cpf = ?,codigo_usuario = ? WHERE codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setString(1, funcionario.getCpf());
			ps.setInt(2, funcionario.getCodigo());
			ps.setInt(3, funcionario.getCodigo());
			ps.execute();
			ps.close();
			atualizado = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return atualizado;

	}

	public boolean excluiFuncionario(Funcionario funcionario) {
		boolean excluido = false;
		String sql = "DELETE funcionario WHERE codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, funcionario.getCodigo());
			ps.execute();
			ps.close();
			excluido = true;
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return excluido;
	}

	public Funcionario pegaCodigos(Funcionario funcionario) {
		Funcionario funcionarioConsultado = new Funcionario();
		StringBuffer sql = new StringBuffer();
		sql.append(" select funcionario.codigo as codigo_funcionario,");
		sql.append("funcionario.codigo_usuario as codigo_usuario,");
		sql.append("pessoa.codigo_contato as codigo_contato,");
		sql.append("pessoa.codigo_endereco as codigo_endereco");
		sql.append(" FROM funcionario");
		sql.append(" INNER JOIN pessoa");
		sql.append(" on ? = pessoa.codigo");
		try {
			PreparedStatement ps = c.prepareStatement(sql.toString());
			ps.setInt(1, funcionario.getCodigo());
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				
				funcionarioConsultado.setCodigo(rs.getInt("codigo_funcionario"));
				funcionarioConsultado.setCodigo_usuario(rs.getInt("codigo_usuario"));
				funcionarioConsultado.setCodigo_contato(rs.getInt("codigo_contato"));
				funcionarioConsultado.setCodigo_endereco(rs.getInt("codigo_endereco"));
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return funcionarioConsultado;
	}
	
	public Funcionario consultaFuncionario(Funcionario funcionario) {
		Funcionario funcionarioConsultado = new Funcionario();
		String sql = "SELECT codigo, cpf, codigo_usuario, cargo FROM funcionario Where codigo = ?";
		try {
			PreparedStatement ps = c.prepareStatement(sql);
			ps.setInt(1, funcionario.getCodigo());
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				funcionarioConsultado.setCodigo(rs.getInt("codigo"));
				funcionarioConsultado.setCpf(rs.getString("cpf"));
				funcionarioConsultado.setCodigo_usuario(rs.getInt("codigo_usuario"));
				funcionarioConsultado.setCargo(rs.getString("cargo"));
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return funcionarioConsultado;
	}


	public List<Funcionario> consultaListaFuncionario() {
		List<Funcionario> listaFuncionario = new ArrayList<Funcionario>();
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT funcionario.codigo as codigo,");
		sql.append("pessoa.nome as nome,");
		sql.append("funcionario.cargo as cargo,");
		sql.append("contato.email as email,");
		sql.append("endereco.logradouro as logradouro,");
		sql.append("contato.telefone as telefone,");
		sql.append("contato.celular as celular");
		sql.append(" FROM funcionario");
		sql.append(" INNER JOIN pessoa");
		sql.append(" ON pessoa.codigo = funcionario.codigo");
		sql.append(" INNER JOIN contato");
		sql.append(" ON pessoa.codigo_contato = contato.codigo");
		sql.append(" INNER JOIN endereco");
		sql.append(" ON pessoa.codigo_endereco = endereco.codigo");
		try {
			PreparedStatement ps = c.prepareStatement(sql.toString());
			ResultSet rs = ps.executeQuery();
			while (rs.next()) {

				Funcionario funcionarioConsultado = new Funcionario();
				Endereco endereco = new Endereco();
				Contato contato = new Contato();

				funcionarioConsultado.setCodigo(rs.getInt("codigo"));
				funcionarioConsultado.setNome(rs.getString("nome"));
				funcionarioConsultado.setCargo(rs.getString("cargo"));
				funcionarioConsultado.getContato().setEmail(
						rs.getString("email"));
				funcionarioConsultado.getEndereco().setLogradouro(
						rs.getString("logradouro"));
				funcionarioConsultado.getContato().setTelefone(
						rs.getString("telefone"));
				funcionarioConsultado.getContato().setCelular(
						rs.getString("celular"));
				listaFuncionario.add(funcionarioConsultado);
			}
			rs.close();
			ps.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(), "Erro",
					JOptionPane.ERROR_MESSAGE);
		}
		return listaFuncionario;
	}

	public int selecionarUltimoFuncionario() throws SQLException {
		String sql = "select max(codigo) as codigo from funcionario";
		Connection con = GenericDAO.getConnection();
		PreparedStatement prepare = con.prepareStatement(sql);
		ResultSet result = prepare.executeQuery();
		int codigo = 0;

		while (result.next()) {
			codigo = result.getInt("codigo");
		}

		return codigo;
	}

}
